library(readr)
library(tidyverse)
Warning: package ‘ggplot2’ was built under R version 4.4.2
Warning: package ‘stringr’ was built under R version 4.4.3
── Attaching core tidyverse packages ───────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ purrr     1.0.2
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
── Conflicts ─────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(sf)
Warning: package ‘sf’ was built under R version 4.4.2
Linking to GEOS 3.12.2, GDAL 3.9.3, PROJ 9.4.1; sf_use_s2() is TRUE
library(sp)
Warning: package ‘sp’ was built under R version 4.4.2
library(viridis)
Warning: package ‘viridis’ was built under R version 4.4.3
Loading required package: viridisLite
library(tigris)
Warning: package ‘tigris’ was built under R version 4.4.3
To enable caching of data, set `options(tigris_use_cache = TRUE)`
in your R script or .Rprofile.
options(tigris_use_cache = T)

Load Data and Add Census Tracts

df = read_csv("Final_Cleaned_Data.csv", col_types = cols(GEOID = "c"))
dc_tracts = tracts(state = "DC", cb = T, year = 2022)
Using FIPS code '11' for state 'DC'
df = left_join(df, dc_tracts %>%
                 select(c(GEOID, geometry, ALAND, AWATER)), by = "GEOID")
summary(df)
    GEOID           TotalPopulation     DIABETES         CASTHMA      
 Length:206         Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
 Class :character   1st Qu.:0.2500   1st Qu.:0.2439   1st Qu.:0.2341  
 Mode  :character   Median :0.5000   Median :0.4976   Median :0.4951  
                    Mean   :0.4999   Mean   :0.4956   Mean   :0.4878  
                    3rd Qu.:0.7500   3rd Qu.:0.7500   3rd Qu.:0.7488  
                    Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
   m1_1_sch_1         m1_2_qua_1      total_score     crime_burden_per_1000
 Min.   :0.004854   Min.   :0.1141   Min.   :0.0000   Min.   :0.0000       
 1st Qu.:0.253641   1st Qu.:0.2536   1st Qu.:0.6134   1st Qu.:0.2206       
 Median :0.507282   Median :0.5024   Median :1.5482   Median :0.4461       
 Mean   :0.504854   Mean   :0.5024   Mean   :2.2279   Mean   :0.6735       
 3rd Qu.:0.756068   3rd Qu.:0.7512   3rd Qu.:3.2874   3rd Qu.:0.9895       
 Max.   :1.000000   Max.   :1.0000   Max.   :9.2010   Max.   :3.0459       
   percentile     weighted_mean_dist_m weighted_mean_percentile   LOWINCOME     
 Min.   :0.0000   Min.   : 112.9       Min.   : 4.733           Min.   :   0.0  
 1st Qu.:0.2488   1st Qu.: 289.0       1st Qu.:22.588           1st Qu.: 277.0  
 Median :0.4976   Median : 450.6       Median :39.535           Median : 570.5  
 Mean   :0.4976   Mean   : 513.7       Mean   :42.303           Mean   : 800.6  
 3rd Qu.:0.7464   3rd Qu.: 669.6       3rd Qu.:58.700           3rd Qu.:1164.8  
 Max.   :0.9951   Max.   :1855.9       Max.   :96.370           Max.   :3181.0  
   LOWINCPCT      UNEMPLOYED        UNEMPPCT      TRACT_COUNT_Alcohol_Li
 Min.   :0.00   Min.   :  0.00   Min.   :0.0000   Min.   :0.0000        
 1st Qu.:0.25   1st Qu.: 43.25   1st Qu.:0.2500   1st Qu.:0.2049        
 Median :0.50   Median : 97.00   Median :0.5000   Median :0.4683        
 Mean   :0.50   Mean   :137.20   Mean   :0.4998   Mean   :0.4724        
 3rd Qu.:0.75   3rd Qu.:197.50   3rd Qu.:0.7500   3rd Qu.:0.7366        
 Max.   :1.00   Max.   :564.00   Max.   :1.0000   Max.   :1.0000        
 TRACT_COUNT_Grocery_St TRACT_COUNT_Healthy_Co TRACT_COUNT_Independen
 Min.   :0.0000         Min.   :0.0000         Min.   :0.0000        
 1st Qu.:0.0000         1st Qu.:0.0000         1st Qu.:0.0000        
 Median :0.0000         Median :0.0000         Median :0.0000        
 Mean   :0.2520         Mean   :0.2036         Mean   :0.2131        
 3rd Qu.:0.6439         3rd Qu.:0.5634         3rd Qu.:0.7366        
 Max.   :0.9902         Max.   :1.0000         Max.   :1.0000        
 TRACT_COUNT_Leaking_Un TRACT_COUNT_Metro_Bus_ TRACT_COUNT_Metro_Stat
 Min.   :0.0000         Min.   :0.0000         Min.   :0.0000        
 1st Qu.:0.1854         1st Qu.:0.2488         1st Qu.:0.0000        
 Median :0.4780         Median :0.4976         Median :0.0000        
 Mean   :0.4705         Mean   :0.4831         Mean   :0.1480        
 3rd Qu.:0.7463         3rd Qu.:0.7317         3rd Qu.:0.0000        
 Max.   :1.0000         Max.   :1.0000         Max.   :0.9854        
 TRACT_COUNT_Parks_and_ TRACT_COUNT_Police_Sta TRACT_COUNT_Primary_Ca
 Min.   :0.0000         Min.   :0.00000        Min.   :0.0000        
 1st Qu.:0.0000         1st Qu.:0.00000        1st Qu.:0.0000        
 Median :0.3805         Median :0.00000        Median :0.0000        
 Mean   :0.3625         Mean   :0.06784        Mean   :0.1689        
 3rd Qu.:0.6976         3rd Qu.:0.00000        3rd Qu.:0.0000        
 Max.   :1.0000         Max.   :0.93171        Max.   :1.0000        
 TRACT_COUNT_Recreation dist_to_m_Alcohol_Li dist_to_m_Grocery_St dist_to_m_Healthy_Co
 Min.   :0.0000         Min.   :0.00         Min.   :0.00         Min.   :0.00        
 1st Qu.:0.0000         1st Qu.:0.25         1st Qu.:0.25         1st Qu.:0.25        
 Median :0.0000         Median :0.50         Median :0.50         Median :0.50        
 Mean   :0.2857         Mean   :0.50         Mean   :0.50         Mean   :0.50        
 3rd Qu.:0.6098         3rd Qu.:0.75         3rd Qu.:0.75         3rd Qu.:0.75        
 Max.   :0.9854         Max.   :1.00         Max.   :1.00         Max.   :1.00        
 dist_to_m_Independen dist_to_m_Leaking_Un dist_to_m_Metro_Bus_ dist_to_m_Metro_Stat
 Min.   :0.00         Min.   :0.00         Min.   :0.00         Min.   :0.00        
 1st Qu.:0.25         1st Qu.:0.25         1st Qu.:0.25         1st Qu.:0.25        
 Median :0.50         Median :0.50         Median :0.50         Median :0.50        
 Mean   :0.50         Mean   :0.50         Mean   :0.50         Mean   :0.50        
 3rd Qu.:0.75         3rd Qu.:0.75         3rd Qu.:0.75         3rd Qu.:0.75        
 Max.   :1.00         Max.   :1.00         Max.   :1.00         Max.   :1.00        
 dist_to_m_Parks_and_ dist_to_m_Police_Sta dist_to_m_Primary_Ca dist_to_m_Recreation
 Min.   :0.0000       Min.   :0.00         Min.   :0.00         Min.   :0.00        
 1st Qu.:0.2500       1st Qu.:0.25         1st Qu.:0.25         1st Qu.:0.25        
 Median :0.5000       Median :0.50         Median :0.50         Median :0.50        
 Mean   :0.4999       Mean   :0.50         Mean   :0.50         Mean   :0.50        
 3rd Qu.:0.7500       3rd Qu.:0.75         3rd Qu.:0.75         3rd Qu.:0.75        
 Max.   :1.0000       Max.   :1.00         Max.   :1.00         Max.   :1.00        
 TRACT_COUNT_Hospital TRACT_COUNT_Food_Access TRACT_COUNT_Public_House     ALAND        
 Min.   :0.00000      Min.   :0.0000          Min.   :0.0000           Min.   :  93419  
 1st Qu.:0.00000      1st Qu.:0.2488          1st Qu.:0.0000           1st Qu.: 290739  
 Median :0.00000      Median :0.4976          Median :0.0000           Median : 507150  
 Mean   :0.06396      Mean   :0.4547          Mean   :0.1766           Mean   : 768525  
 3rd Qu.:0.00000      3rd Qu.:0.7256          3rd Qu.:0.0000           3rd Qu.: 907396  
 Max.   :1.00000      Max.   :1.0000          Max.   :1.0000           Max.   :6514228  
     AWATER                 geometry  
 Min.   :      0   POLYGON      :206  
 1st Qu.:      0   epsg:4269    :  0  
 Median :      0   +proj=long...:  0  
 Mean   :  90824                      
 3rd Qu.:   2424                      
 Max.   :5139082                      
df_centroids = st_centroid(df_sf$geometry)
Error: object 'df_sf' not found

Plot Data

library(plotly)
Warning: package ‘plotly’ was built under R version 4.4.3
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
p = ggplot(data = df_sf) + 
  geom_sf(aes(geometry = geometry, fill = dist_to_m_Metro_Stat), color = NA) + 
  geom_sf(aes(geometry = centroids, size = CASTHMA), color = "black", alpha = 0.4) + 
  scale_fill_viridis(alpha = 0.9) +
  labs(title = "Plot of Distance to Metro Stations", 
       subtitle = "Percentile",
       y = "Longitude", x = "Latitude",
       fill = "Distance",
       size = "Asthma")

ggplotly(p)

Plot Individual Indexes

names = names(df[, -c(1, ncol(df))])
for(i in 1:(ncol(df) - 2)) {
  plot = ggplot(data = df) +
    geom_sf(aes(geometry = geometry, fill = !!sym(names[i])), col = NA) + 
    scale_fill_viridis(alpha = 0.9) + 
    labs(x = "Latitude", y = "Longitude",
         title = paste("Plot of", names[i]),
         subtitle = "Percentile")
  ggsave(plot = plot, paste("./plots/", names[i], ".png", sep = ""))
}
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHNwKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeSh0aWdyaXMpDQpvcHRpb25zKHRpZ3Jpc191c2VfY2FjaGUgPSBUKQ0KYGBgDQoNCiMgTG9hZCBEYXRhIGFuZCBBZGQgQ2Vuc3VzIFRyYWN0cw0KDQpgYGB7cn0NCmRmID0gcmVhZF9jc3YoIkZpbmFsX0NsZWFuZWRfRGF0YS5jc3YiLCBjb2xfdHlwZXMgPSBjb2xzKEdFT0lEID0gImMiKSkNCmRjX3RyYWN0cyA9IHRyYWN0cyhzdGF0ZSA9ICJEQyIsIGNiID0gVCwgeWVhciA9IDIwMjIpDQoNCmRmID0gbGVmdF9qb2luKGRmLCBkY190cmFjdHMgJT4lDQogICAgICAgICAgICAgICAgIHNlbGVjdChjKEdFT0lELCBnZW9tZXRyeSwgQUxBTkQsIEFXQVRFUikpLCBieSA9ICJHRU9JRCIpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGRmKQ0KYGBgDQoNCmBgYHtyfQ0KZGZfc2YgPSBzdF9hc19zZihkZikNCmRmX3NmJGNlbnRyb2lkcyA9IHN0X2NlbnRyb2lkKGRmX3NmJGdlb21ldHJ5KQ0KYGBgDQoNCiMgUGxvdCBEYXRhDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBkZl9zZikgKyANCiAgZ2VvbV9zZihhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSwgZmlsbCA9IGRpc3RfdG9fbV9NZXRyb19TdGF0KSwgY29sb3IgPSBOQSkgKyANCiAgZ2VvbV9zZihhZXMoZ2VvbWV0cnkgPSBjZW50cm9pZHMsIHNpemUgPSBDQVNUSE1BKSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNCkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGFscGhhID0gMC45KSArDQogIGxhYnModGl0bGUgPSAiUGxvdCBvZiBEaXN0YW5jZSB0byBNZXRybyBTdGF0aW9ucyIsIA0KICAgICAgIHN1YnRpdGxlID0gIlBlcmNlbnRpbGUiLA0KICAgICAgIHkgPSAiTG9uZ2l0dWRlIiwgeCA9ICJMYXRpdHVkZSIsDQogICAgICAgZmlsbCA9ICJEaXN0YW5jZSIsDQogICAgICAgc2l6ZSA9ICJBc3RobWEiKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShwbG90bHkpDQpwID0gZ2dwbG90KGRhdGEgPSBkZl9zZikgKyANCiAgZ2VvbV9zZihhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSwgZmlsbCA9IGRpc3RfdG9fbV9NZXRyb19TdGF0KSwgY29sb3IgPSBOQSkgKyANCiAgZ2VvbV9zZihhZXMoZ2VvbWV0cnkgPSBjZW50cm9pZHMsIHNpemUgPSBDQVNUSE1BKSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNCkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGFscGhhID0gMC45KSArDQogIGxhYnModGl0bGUgPSAiUGxvdCBvZiBEaXN0YW5jZSB0byBNZXRybyBTdGF0aW9ucyIsIA0KICAgICAgIHN1YnRpdGxlID0gIlBlcmNlbnRpbGUiLA0KICAgICAgIHkgPSAiTG9uZ2l0dWRlIiwgeCA9ICJMYXRpdHVkZSIsDQogICAgICAgZmlsbCA9ICJEaXN0YW5jZSIsDQogICAgICAgc2l6ZSA9ICJBc3RobWEiKQ0KDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCiMjIFBsb3QgSW5kaXZpZHVhbCBJbmRleGVzDQoNCmBgYHtyfQ0KbmFtZXMgPSBuYW1lcyhkZlssIC1jKDEsIG5jb2woZGYpKV0pDQpmb3IoaSBpbiAxOihuY29sKGRmKSAtIDIpKSB7DQogIHBsb3QgPSBnZ3Bsb3QoZGF0YSA9IGRmKSArDQogICAgZ2VvbV9zZihhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSwgZmlsbCA9ICEhc3ltKG5hbWVzW2ldKSksIGNvbCA9IE5BKSArIA0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhhbHBoYSA9IDAuOSkgKyANCiAgICBsYWJzKHggPSAiTGF0aXR1ZGUiLCB5ID0gIkxvbmdpdHVkZSIsDQogICAgICAgICB0aXRsZSA9IHBhc3RlKCJQbG90IG9mIiwgbmFtZXNbaV0pLA0KICAgICAgICAgc3VidGl0bGUgPSAiUGVyY2VudGlsZSIpDQogIGdnc2F2ZShwbG90ID0gcGxvdCwgcGFzdGUoIi4vcGxvdHMvIiwgbmFtZXNbaV0sICIucG5nIiwgc2VwID0gIiIpKQ0KfQ0KYGBgDQo=